package org.tis.tools.abf.module.sys.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.tis.tools.abf.module.sys.controller.request.SysSeqnoResetRequest;
import org.tis.tools.abf.module.sys.dao.SysSeqnoMapper;
import org.tis.tools.abf.module.sys.entity.SysSeqno;
import org.tis.tools.abf.module.sys.entity.enums.SeqnoReset;
import org.tis.tools.abf.module.sys.exception.SysManagementException;
import org.tis.tools.abf.module.sys.service.ISysSeqnoService;
import org.tis.tools.core.utils.StringUtil;

import java.math.BigDecimal;

@Service
@Transactional( rollbackFor = Exception.class)
public class SysSeqnoServiceImpl extends ServiceImpl<SysSeqnoMapper, SysSeqno> implements ISysSeqnoService {

    @Override
    public void add(SysSeqnoResetRequest sysSeqnoResetRequest) throws SysManagementException {

        SysSeqno sysSeqno = new SysSeqno();

        //收集参数
        sysSeqno.setSeqKey(sysSeqnoResetRequest.getSeqKey());
        sysSeqno.setSeqName(sysSeqnoResetRequest.getSeqName());
        sysSeqno.setReset(sysSeqnoResetRequest.getReset());
        sysSeqno.setResetParams(sysSeqnoResetRequest.getResetParams());
        sysSeqno.setSeqNo(BigDecimal.valueOf(Double.valueOf(sysSeqnoResetRequest.getSeqNo())));

        insert(sysSeqno);
    }

    @Override
    public SysSeqno change(SysSeqnoResetRequest sysSeqnoResetRequest) throws SysManagementException {

        SysSeqno sysSeqno = new SysSeqno();

        sysSeqno.setSeqKey(sysSeqnoResetRequest.getSeqKey());
        sysSeqno.setSeqName(sysSeqnoResetRequest.getSeqName());
        sysSeqno.setSeqNo(BigDecimal.valueOf(Double.valueOf(sysSeqnoResetRequest.getSeqNo())));
        sysSeqno.setReset(sysSeqnoResetRequest.getReset());
        sysSeqno.setResetParams(sysSeqnoResetRequest.getResetParams());

        updateById(sysSeqno);

        return sysSeqno;
    }

    /**
     * 获取下一个序列号
     */
    @Override
    public long getNextSequence(String seqKey, String seqName) throws SysManagementException {
        long seq;
        // TODO 增加Redis能力
        SysSeqno sysSeqno = selectById(seqKey);
        // 如果没有该资源，新增资源
        if(sysSeqno == null) {
            SysSeqno seqno = new SysSeqno();
            seqno.setSeqKey(seqKey);
            seqno.setSeqName(seqName);
            seqno.setSeqNo(new BigDecimal("2"));
            seqno.setReset(SeqnoReset.EVER);
            insert(seqno);
            seq = 1;
        } else {
            BigDecimal curNo = sysSeqno.getSeqNo();
            sysSeqno.setSeqNo(curNo.add(new BigDecimal(1)));
            updateById(sysSeqno);
            seq = curNo.longValue();
        }
        return seq;
    }

    /**
     * 列表查询
     */
    @Override
    public Page<SysSeqno> listFilter(Page<SysSeqno> page, Wrapper<SysSeqno> wrapper) throws SysManagementException {

        Wrapper<SysSeqno> seqnoWrapper = new EntityWrapper<SysSeqno>();

        if (null != wrapper.getEntity()){
            SysSeqno sysSeqno = wrapper.getEntity();
            if (!StringUtil.isEmpty(sysSeqno.getSeqKey())){
                seqnoWrapper.like(SysSeqno.COLUMN_SEQ_KEY,sysSeqno.getSeqKey());
            }
            if (!StringUtil.isEmpty(sysSeqno.getSeqName())){
                seqnoWrapper.like(SysSeqno.COLUMN_SEQ_NAME,sysSeqno.getSeqName());
            }
            if (null != sysSeqno.getSeqNo()){
                seqnoWrapper.like(SysSeqno.COLUMN_SEQ_NO,sysSeqno.getSeqNo().toEngineeringString());
            }
            if (!StringUtil.isEmpty(sysSeqno.getResetParams())){
                seqnoWrapper.like(SysSeqno.COLUMN_RESET_PARAMS,sysSeqno.getResetParams());
            }
        }

        return selectPage(page,seqnoWrapper);
    }
}
